package thread.test1BaseThread.notify;

import java.util.List;

public class Consumer implements Runnable {
    private Object lock;
    private List list;


    public Consumer(Object lock, List list) {
        this.lock = lock;
        this.list = list;
    }


    @Override
    public void run() {
        while (true) {
            synchronized (lock) {
                //注意这里要用while 不能用if，因为 if只执行一次，而while会执行两次，
                //执行完里面的内容后，会再回到while判断一下条件。这里假设t1.notifyAll()
                //然后有线程t2 和线程t3,，t2截胡了，执行完后再notity,这时后线程3 获取到了，当前对象
                //没有元素，因为if 不会再回去检测size大小，就会拿到空对象，这里的关键点是 notify 没发控制
                //唤醒的是生产者还是消费者
                while (list.size() < 1) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                System.out.println("消费" + list.get(0));
                list.remove(0);
                //notify在多线程环境下会出现假死的情况。因为没法做到notify 的生产者还是消费者，
                //lock.notify();
                lock.notifyAll();
            }
        }

    }

}
